#!/bin/bash

# 测试嵌套文件列表功能
# 支持 -f 指令的迭代读取

set -e  # 遇到错误立即退出

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"  # 留在 modb 目录中

echo "开始嵌套文件列表功能测试..."

# 创建测试文件
echo "创建测试文件..."

# 创建简单的测试模块
cat > test_module1.v << 'EOF'
module test_module1 (
    input clk,
    input reset,
    output reg [7:0] data
);
    always @(posedge clk or posedge reset) begin
        if (reset)
            data <= 8'h00;
        else
            data <= data + 1;
    end
endmodule
EOF

cat > test_module2.v << 'EOF'
module test_module2 (
    input [7:0] data_in,
    output [7:0] data_out
);
    assign data_out = data_in + 1;
endmodule
EOF

cat > test_module3.v << 'EOF'
module test_module3 (
    input enable,
    output ready
);
    assign ready = enable;
endmodule
EOF

# 创建嵌套的文件列表结构
echo "创建嵌套文件列表..."

# 主文件列表
cat > main.list << 'EOF'
# 主文件列表
test_module1.v
-f sub1.list
test_module2.v
-f sub2.list
EOF

# 子文件列表1
cat > sub1.list << 'EOF'
# 子文件列表1
test_module3.v
-f sub3.list
EOF

# 子文件列表2
cat > sub2.list << 'EOF'
# 子文件列表2
# 这里没有更多文件，只是为了测试空的子列表
EOF

# 子文件列表3（三层嵌套）
cat > sub3.list << 'EOF'
# 子文件列表3 - 三层嵌套
test_module1.v
EOF

# 测试循环引用检测
cat > circular1.list << 'EOF'
test_module1.v
-f circular2.list
EOF

cat > circular2.list << 'EOF'
test_module2.v
-f circular1.list
EOF

if [[ -f "./moparse" ]]; then
    MOPARSE="./moparse"
else
    echo "错误: 找不到 moparse 可执行文件"
    echo "请先编译 moparse： g++ -std=c++14 -Wall -Wextra -O2 moparse.cpp modb.pb.cc -o moparse -lprotobuf"
    exit 1
fi

# 测试1: 基本嵌套解析
echo -n "测试1: 基本嵌套解析 ... "
if $MOPARSE -f main.list -o nested_output.modb > nested_test.log 2>&1; then
    echo "通过"
else
    echo "失败"
    cat nested_test.log
    exit 1
fi

# 验证解析结果
echo -n "验证解析结果 ... "
if $MOPARSE -s nested_output.modb | grep -q "test_module"; then
    echo "通过"
else
    echo "失败"
    exit 1
fi

# 测试2: 循环引用检测
echo -n "测试2: 循环引用检测 ... "
if $MOPARSE -f circular1.list -o circular_output.modb > circular_test.log 2>&1; then
    if grep -q "检测到循环引用" circular_test.log; then
        echo "通过"
    else
        echo "失败: 未检测到循环引用"
        cat circular_test.log
        exit 1
    fi
else
    echo "失败: 解析失败"
    cat circular_test.log
    exit 1
fi

# 测试3: 不存在的嵌套文件
echo -n "测试3: 不存在的嵌套文件处理 ... "
cat > bad_nested.list << 'EOF'
test_module1.v
-f nonexistent.list
EOF

if $MOPARSE -f bad_nested.list -o bad_output.modb > bad_test.log 2>&1; then
    echo "失败: 应该失败但成功了"
    exit 1
else
    if grep -q "无法打开文件列表" bad_test.log; then
        echo "通过"
    else
        echo "失败: 错误信息不正确"
        cat bad_test.log
        exit 1
    fi
fi

# 测试4: 显示详细信息
echo -n "测试4: 显示嵌套解析的详细信息 ... "
if $MOPARSE -sv nested_output.modb > detail_test.log 2>&1; then
    if grep -q "模块名:" detail_test.log; then
        echo "通过"
    else
        echo "失败: 没有模块信息"
        cat detail_test.log
        exit 1
    fi
else
    echo "失败"
    cat detail_test.log
    exit 1
fi

# 清理测试文件
echo "清理测试文件..."
rm -f test_module*.v *.list *.modb *.log

echo
echo "嵌套文件列表功能测试总结:"
echo "✓ 基本嵌套解析"
echo "✓ 循环引用检测"
echo "✓ 错误处理"
echo "✓ 详细信息显示"
echo
echo "所有嵌套文件列表测试通过!"